package br.ufrn.findabomb.controller;

import java.net.MalformedURLException;
import java.net.URL;

import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.util.JsonParserSequence;
import org.json.JSONException;
import org.json.JSONObject;

import br.ufrn.findabomb.model.Player;
import br.ufrn.findabomb.model.Room;
import br.ufrn.findabomb.model.ServerResponse;

public class ServerFassade {
	public enum AtrId {
		PLAYER_NAME, PLAYER_ID, PLAYER_LOGIN, PLAYER_EMAIL, ROOM_ID, ROOM_NAME
	}

	/**
	 * Cria uma conta para o novo usuário
	 * 
	 * @param name
	 * @param email
	 * @param passwd
	 * @return Resposta do servidor
	 */
	public static ServerResponse createAccount(String login, String name, String email,
			String passwd) {
		try{
			URL url = new URL("localhost:9000/createAccount/"+login+"/"+name+"/"+passwd+"/"+email);
			String str = url.getFile();
			ServerResponse sr = ServerResponse.parse(new JSONObject(str));
			return sr;
		} catch(Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * Cria uma sala de jogo
	 * 
	 * @param requester
	 *            Jogador que está requisitando a criação
	 * @param name
	 *            Noma da sala
	 * @param passwd
	 *            Senha para a sala
	 * @return Resposta do servidor
	 */
	public static ServerResponse createRoom(Player requester, String name,
			String passwd) {
		try{
			URL url = new URL("localhost:9000/createRoom/"+requester+"/"+name+"/"+passwd);
			String str = url.getFile();
			ServerResponse sr = ServerResponse.parse(new JSONObject(str));
			return sr;
		} catch(Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * Entra em uma sala existente
	 * 
	 * @param requester
	 *            Jogador que requisita a entrada
	 * @param room
	 *            Sala que se deseja entrar
	 * @param passwd
	 *            Senha para a sala (opcional)
	 * @return Resposta do servidor
	 */
	public static ServerResponse joinRoom(Player requester, Room room,
			String passwd) {
		try{
			URL url = new URL("localhost:9000/joinRoom/"+requester+"/"+room+"/"+passwd);
			String str = url.getFile();
			ServerResponse sr = ServerResponse.parse(new JSONObject(str));
			return sr;
		} catch(Exception e) {
			e.printStackTrace();
		}
		return null;
 	}

	/**
	 * Tenta autenticar-se com o servidor
	 * 
	 * @param login
	 *            Nome de login
	 * @param passwd
	 *            Senha do usuário
	 * @return Resposta do servidor
	 */
	public static ServerResponse login(String login, String passwd) {
		try{
			URL url = new URL("localhost:9000/login/"+login+"/"+passwd);
			String str = url.getFile();
			ServerResponse sr = ServerResponse.parse(new JSONObject(str));
			return sr;
		} catch(Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * Processa uma determinada query no servidor Para inserir a variável na
	 * query, utilize %v, e crie expressões booleanas
	 * 
	 * @param atr
	 *            Atributo que se deseja buscar
	 * @param query
	 *            Query a ser processada, expressão booleana
	 * @return Resposta do servidor
	 */
	/*
	 * public static ServerResponse query(AtrId atr, String query) { return
	 * null; }
	 */

	/**
	 * Retorna a posição da bomba (uma Tripla) de uma determinada Room
	 * 
	 * @param room
	 * @return
	 */
	public static ServerResponse checkBombPosition(Player p, Room room) {
		try{
			URL url = new URL("localhost:9000/getBombPos/"+p.getName()+"/"+room.getName());
			String str = url.getFile();
			ServerResponse sr = ServerResponse.parse(new JSONObject(str));
			return sr;
		} catch(Exception e) {
			e.printStackTrace();
		}
		return null;
		
	}

	public static ServerResponse find(Class<?> class1, String name) {
		try {
			URL url = null;
			url = new URL("localhost:9000/find" + class1.getName() + "/" + name);
			String sss = url.getFile();
			class1.getName();
			JSONObject js = null;
			js = new JSONObject(sss);
			return ServerResponse.parse(js);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
